/*
 * 演示设置管理菜单 - 演示设置管理菜单定义
 * 
 * 主要功能：
 * - 定义演示设置的管理菜单
 * - 提供站点设置的导航入口
 * - 演示管理菜单的使用
 * - 支持站点配置的管理
 */

using Lombiq.TrainingDemo.Drivers;
using Lombiq.TrainingDemo.Permissions;
using Microsoft.Extensions.Localization;
using OrchardCore.Navigation;
using System;
using System.Threading.Tasks;

namespace Lombiq.TrainingDemo.Navigation;

/// <summary>
/// 演示设置管理菜单 - 定义演示设置的管理菜单
/// 
/// 主要用途：
/// - 定义演示设置的管理菜单
 //* - 提供站点设置的导航入口
 //* - 演示管理菜单的使用
 //* - 支持站点配置的管理
 //* 
 //* 使用场景：
/// - 在管理界面中显示演示设置菜单
/// - 提供站点配置的访问入口
/// - 支持权限控制的菜单显示
/// - 提供用户友好的导航体验
/// 
/// 设计原因：
/// - 为演示设置提供管理界面
/// - 实现权限控制的菜单显示
/// - 支持本地化的菜单文本
/// - 提供统一的导航体验
/// 
/// 设计模式：
/// - 菜单模式：实现INavigationProvider接口
/// - 权限模式：使用权限检查控制访问
/// - 本地化模式：使用IStringLocalizer支持多语言
/// - 构建模式：使用NavigationBuilder构建菜单
/// </summary>
// 要在管理菜单上实际看到菜单项，我们需要为其添加导航提供程序。
public sealed class DemoSettingsAdminMenu : INavigationProvider
{
    private readonly IStringLocalizer T;

    /// <summary>
    /// 构造函数 - 注入字符串本地化器
    /// </summary>
    /// <param name="stringLocalizer">字符串本地化器</param>
    public DemoSettingsAdminMenu(IStringLocalizer<DemoSettingsAdminMenu> stringLocalizer) => T = stringLocalizer;

    /// <summary>
    /// 构建导航异步方法 - 构建演示设置管理菜单
    /// 
    /// 功能说明：
    /// - 检查导航名称是否为admin
    /// - 构建多级菜单结构
    /// - 添加权限控制
    /// - 支持本地导航
    /// 
    /// 菜单结构：
    /// - Configuration（配置）
    /// - Settings（设置）
    /// - Demo（演示）
    /// 
    /// 权限控制：
    /// - 使用DemoSettingsPermissions.ManageDemoSettings权限
    /// - 只有有权限的用户才能看到菜单
    /// - 支持细粒度的权限控制
    /// 
    /// 导航特性：
    /// - 使用LocalNav()支持本地导航
    /// - 指向OrchardCore.Settings模块的AdminController
    /// - 使用编辑器组ID确保正确显示
    /// </summary>
    /// <param name="name">导航名称</param>
    /// <param name="builder">导航构建器</param>
    /// <returns>完成的任务</returns>
    public ValueTask BuildNavigationAsync(string name, NavigationBuilder builder)
    {
        if (!string.Equals(name, "admin", StringComparison.OrdinalIgnoreCase)) return ValueTask.CompletedTask;

        // 如果您想将菜单项放在现有菜单项的更深层次下，您只需要使用现有项目的菜单文本来构建菜单。
        // 这里的Configuration和Settings菜单项已经是现有项目，这是您应该放置站点设置的地方，
        // 但是，如果您愿意，您可以使用任何其他位置。
        builder.Add(T["Configuration"], configuration => configuration
            .Add(T["Settings"], settings => settings
                .Add(T["Demo"], T["Demo"], demo => demo
                    // Action将是OrchardCore.Settings模块中的AdminController.Index操作。
                    // 它将确保显示正确的编辑器组，所以也使用您可公开访问的编辑器组常量给出编辑器组ID。
                    .Action("Index", "Admin", new { area = "OrchardCore.Settings", groupId = DemoSettingsDisplayDriver.EditorGroupId })
                    // 授权，这样只有在用户有权访问时才会显示。
                    .Permission(DemoSettingsPermissions.ManageDemoSettings)
                    // 这是一个三级菜单项，所以如果支持的话，将其放在本地导航上。
                    .LocalNav()
                )));

        return ValueTask.CompletedTask;
    }
}

// 下一站：让我们回到Controllers/SiteSettingsController！
